/**
 * 倒数-计步器
 *
 * 业务场景：ajax 发起 3 个 请求，需要等待 3 个请求都完结，才能关闭加载条。
 */
class Pedometer {
    // 计数器
    cnt = 0;
    // 操作的实体类
    tag = null;
    // 开始回调
    started = null;
    // 结束回调
    finished = null;

    /**
     * 启动事件
     *
     * @param fun 开始回调函数
     * @returns 当前实例，支持链式调用
     */
    onStarted(fun) {
        this.started = fun;
        return this;
    }

    /**
     * 结束事件
     *
     * @param fun 结束回调函数
     * @returns 当前实例，支持链式调用
     */
    onFinished(fun) {
        this.finished = fun;
        return this;
    }

    /**
     * 启动计步器
     *
     * @returns void
     */
    run() {
        // 只有在第一步，才会执行开始回调，并保存返回的标签
        if (this.cnt === 0 && this.started) {
            this.tag = this.started();
        }
        this.cnt++;
    }

    /**
     * 关闭计步器
     *
     * @returns void
     */
    close() {
        if (this.cnt > 0) {
            this.cnt--;
            // 执行结束回调，并返回开始时传递的标签
            if (this.cnt <= 0 && this.finished) {
                // 执行结束回调并传递标签
                this.finished(this.tag);
                this.tag = null;
            }
        }
    }
}

export default Pedometer;